package com.newlink.building.login.ui.fragments

import android.os.Bundle
import android.view.View
import com.newlink.building.login.R
import com.newlink.building.login.databinding.LayoutVerifyCodeBinding
import com.newlink.building.login.event.VerifySMSEvent
import com.newlink.building.login.mvp.contract.Module_Login_InputVerifySMSCodeContract
import com.newlink.building.common_base.base.BaseMvpFragment
import com.newlink.building.common_base.ext.showToast
import com.newlink.building.common_base.utils.DialogUtil
import com.newlink.building.common_base.utils.logDebug
import com.newlink.building.login.mvp.presenter.Module_Login_InputVerifySMSCodePresenter
import org.greenrobot.eventbus.EventBus

/**
 * @Author: admin
 * @Date: 2022/9/13
 * @Description: 短信验证码确认页面，用于用户输入收到的短信验证码，并提交验证。
 * @License: Copyright 1998 Fanvil Technology Co., Ltd. All rights reserved.
 */
class Module_Login_VerifySMSCodeFragment :
    BaseMvpFragment<Module_Login_InputVerifySMSCodeContract.View, Module_Login_InputVerifySMSCodeContract.Presenter>(),
    Module_Login_InputVerifySMSCodeContract.View {

    // 视图绑定实例
    private lateinit var binding: LayoutVerifyCodeBinding

    // 需要验证的手机号码
    private var verifyPhoneNumber: String = ""

    // 验证码的预期长度
    private val CODE_LENGTH: Int = 4

    // 用户输入的验证码
    private var inputVerificationCode: String = ""

    /**
     * 懒加载的等待对话框，用于在发送验证请求时显示。
     */
    private val loadingDialog by lazy {
        DialogUtil.getWaitDialog(requireContext())
    }

    /**
     * Companion object 用于提供 Fragment 实例。
     */
    companion object {
        // Bundle 中用于传递手机号的键
        private const val ARG_VERIFY_PHONE_NUMBER: String = "VERIFY_PHONE"

        /**
         * 获取 VerifySMSCodeFragment 的新实例。
         * @param phoneNumber 需要验证的手机号码。
         * @return VerifySMSCodeFragment 实例。
         */
        fun getInstance(phoneNumber: String): Module_Login_VerifySMSCodeFragment {
            val fragment = Module_Login_VerifySMSCodeFragment()
            val bundle = Bundle().apply {
                putString(ARG_VERIFY_PHONE_NUMBER, phoneNumber)
            }
            fragment.arguments = bundle
            return fragment
        }
    }

    /**
     * 绑定布局文件并返回根视图。
     */
    override fun attachLayoutRes(): View {
        binding = LayoutVerifyCodeBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 创建 Presenter 实例。
     */
    override fun createPresenter(): Module_Login_InputVerifySMSCodeContract.Presenter =
        Module_Login_InputVerifySMSCodePresenter()

    /**
     * 初始化视图组件和设置监听器。
     * @param view Fragment 的根视图。
     */
    override fun initView(view: View) {
        // 从 arguments 中获取需要验证的手机号码
        verifyPhoneNumber = requireArguments().getString(ARG_VERIFY_PHONE_NUMBER, "")

        // 设置验证码输入框上方的提示文本，显示要验证的手机号
        val contentFormat =
            resources.getString(R.string.account_information_bind_phone_input_code_describe)
        binding.verifyContent.text = String.format(contentFormat, verifyPhoneNumber)

        // 配置验证码输入视图的长度和监听器
        binding.verifyView.setTextCount(CODE_LENGTH)
        binding.verifyView.listener = { enteredCode, _ ->
            logDebug<Module_Login_VerifySMSCodeFragment>("输入验证码: $enteredCode")
            if (enteredCode.length == CODE_LENGTH) {
                inputVerificationCode = enteredCode
                loadingDialog.show() // 显示加载对话框
                // 调用 Presenter 发送验证码进行验证
                // 注意：countryCode 变量未在此 Fragment 中定义，假设它是 BaseFragment 或其他地方提供的
                mPresenter?.sendVerifySMSCode(countryCode, verifyPhoneNumber, enteredCode)
            }
        }
    }

    /**
     * 懒加载方法，当前未实现具体逻辑。
     */
    override fun lazyLoad() {
        // 无需额外的数据加载
    }

    /*
     * 以下是 InputVerifySMSCodeContract.View 接口的实现方法
     */

    /**
     * 验证码发送成功回调。
     * 隐藏加载对话框，并发送 `VerifySMSEvent` 通知其他组件验证成功。
     */
    override fun sendVCSuccess() {
        loadingDialog.dismiss()
        // 注意：countryCode 变量未在此 Fragment 中定义，假设它是 BaseFragment 或其他地方提供的
        EventBus.getDefault()
            .post(VerifySMSEvent(countryCode, verifyPhoneNumber, inputVerificationCode))
    }

    /**
     * 验证码发送失败回调。
     * 隐藏加载对话框，显示失败 Toast，并清除验证码输入框。
     * @param msg 失败信息（可选）。
     */
    override fun sendVCFailed(msg: String?) {
        loadingDialog.dismiss()
        showToast(getString(R.string.verify_code_failed))
        binding.verifyView.clear() // 清除已输入的验证码
    }
}